/**
 * 操作符
 * 一元操作符
 * 位操作符
 * 布尔操作符
 * 乘性操作符
 * 指数操作符
 * 加性操作符
 * 关系操作符
 * 相等操作符
 * 条件操作符
 * 赋值操作符
 * 逗号操作符
 */

/**
 * 一元操作符
 * 递增/递减操作符、一元加和减
 */
let age = 29;
++age;
--age;
let s1 = "2";
let s2 = "z";
let b = false;
let f = 1.1;
let o = {
    valueOf() {
        return -1;
    }
};
s1++; // 值变成数值 3
s2++; // 值变成 NaN
b++; // 值变成数值 1
f--; // 值变成 0.10000000000000009（因为浮点数不精确）
o--; // 值变成-2

let num = 25;
num = +num; // 一元加，就是数学中的正号
console.log(num); // 25

let num2 = 25;
num2 = -num2; // 一元减，就是数学中的负号
console.log(num2); // -25


/**
 * 位操作符 用于数值的底层操作 操作内存中表示数据的比特（位） IEEE 754 64 位格式存储
 * 位操作 先把值转换为 32 位整数，再进行位操作，之后再把结果转换为 64 位
 * 与、或、异或、非
 * 位操作的速度很快
 */
// 按位非 ~
let num3 = 25; // 二进制 00000000000000000000000000011001
let num4 = ~num3; // 二进制 11111111111111111111111111100110
console.log(num4); // -26

// 按位与 全是1 则为1 其他都为0，1 & 1 = 1，1 & 0 = 0，0 & 1 = 0，0 & 0 = 0
let num5 = 25; // 二进制 00000000000000000000000000011001
let num6 = 5; // 二进制 00000000000000000000000000000101
let num7 = num5 & num6; // 二进制 00000000000000000000000000000001
console.log(num7); // 1

// 按位或 任意一个为1 则为1 其他都为0，  1 | 1 = 1，1 | 0 = 1，0 | 1 = 1，0 | 0 = 0
let num8 = 25; // 二进制 00000000000000000000000000011001
let num9 = 5; // 二进制 00000000000000000000000000000101
let num10 = num8 | num9; // 二进制 00000000000000000000000000011101
console.log(num10); // 29

// 按位异或 两个不相同为1，相同为0， 1 ^ 1 = 0，1 ^ 0 = 1，0 ^ 1 = 1，0 ^ 0 = 0
let num11 = 25; // 二进制 00000000000000000000000000011001
let num12 = 5; // 二进制 00000000000000000000000000000101
let num13 = num11 ^ num12; // 二进制 00000000000000000000000000011110
console.log(num13); // 28

// 左移 << 数变大
let oldValue = 2; // 等于二进制 10
let newValue = oldValue << 5; // 等于二进制 1000000，即十进制 64

// 有符号右移 >> 数变小
let oldValue2 = 64; // 等于二进制 1000000
let newValue2 = oldValue2 >> 5; // 等于二进制 10，即十进制 2

// 无符号右移 >>>
let oldValue3 = 64; // 等于二进制 1000000
let newValue3 = oldValue3 >>> 5; // 等于二进制 10，即十进制 2

// 在对 -64 无符号右移 5 位后，结果是 134 217 726。 这是因为 -64 的二进制表示是 1111111111111111111
// 1111111000000，无符号右移却将它当成正值，也就是 4 294 967 232。把这个值右移 5 位后，结果是
// 00000111111111111111111111111110，即 134 217 726。
let oldValue4 = -64; // 等于二进制 11111111111111111111111111000000
let newValue4 = oldValue4 >>> 5; // 等于十进制 134217726



